有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Adler32重复速度非常快

我使用adler32校验和算法从数据库id生成一个数字。因此,当我将一行插入数据库时,我获取该行的标识并使用它创建校验和。我遇到的问题是,我只在数据库中插入207次之后生成了一个重复校验和。这比我预期的要快得多。这是我的密码:

String dbIdStr = Long.toString(dbId);
byte[] bytes = dbIdStr.getBytes();
Checksum checksum = new Adler32();
checksum.update(bytes, 0, bytes.length);
result = checksum.getValue();

我做的事情/方式有问题吗?我应该使用不同的方法来创建唯一的字符串吗?我这样做是因为我不想在url中使用db id。。。db结构的改变将打破世界上所有的联系

谢谢


共 (2) 个答案

  1. # 1 楼答案

    您应该而不是使用Adler-32作为哈希代码生成器。这不是它的目的。您应该使用具有良好哈希属性的算法,该算法可以最大限度地降低冲突的概率

    您可以简单地(在任何对象上)使用Java的hashCode方法。对于String对象,哈希代码是String的字节值乘以31的连续幂的总和。很短的字符串可能会发生冲突,但这不是一个可怕的算法。作为散列算法,它肯定比Adler-32好得多

    建议使用加密安全的哈希函数(如SHA-256)对于应用程序来说,无论是在执行时间还是哈希代码大小方面,都是过分的。您应该试试Java的哈希代码,看看会发生多少冲突。如果它似乎比您预期的2-n概率(其中n是散列码中的位数)更频繁,那么您可以使用更好的覆盖它。你可以找到一个链接here for decent Java hash functions

  2. # 2 楼答案

    尝试使用安全的散列函数,如SHA-256。如果您发现任何二进制不相等的数据发生冲突,您的银行帐户将获得1000美元,并表示赞赏。如果/当SHA-2破裂并且您故意输入碰撞,则报价结束。也就是说,输出是32字节而不是32位